package com.bjsxt.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.User;
import com.bjsxt.domain.UserBank;
import com.bjsxt.dto.UserBankDto;
import com.bjsxt.dto.UserBankFeignDto;
import com.bjsxt.mapper.UserBankMapper;
import com.bjsxt.mappers.UserBankFeignDtoMapper;
import com.bjsxt.service.UserBankService;
import com.bjsxt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserBankServiceImpl extends ServiceImpl<UserBankMapper, UserBank> implements UserBankService {

    /**
     * 用户的业务层接口
     */
    @Autowired
    private UserService userService;

    /**
     * 根据用户 id 分页查询银行卡数据
     *
     * @param page   分页对象<UserBank>
     * @param userId 用户 id
     * @return 银行卡分页数据
     */
    @Override
    public Page<UserBank> pageByUserId(Page<UserBank> page, Long userId) {
        //根据响应的条件分页查询银行卡数据并返回
        return page(page, new LambdaQueryWrapper<UserBank>()
                .eq(userId != null, UserBank::getUserId, userId)
        );
    }

    /**
     * 根据用户 id 查询这个用户下具有的银行卡数据
     *
     * @param userId 用户 id
     * @return 持有的银行卡数据列表
     */
    @Override
    public List<UserBank> listByUserId(Long userId) {
        // 调用方法查询当前用户的银行卡数据
        return list(new LambdaQueryWrapper<UserBank>()
                .eq(UserBank::getUserId, userId)
                .eq(UserBank::getStatus, 1)
        );
    }

    /**
     * 根据 userId 获取银行卡数据
     *
     * @param userId 用户 id
     * @return 银行卡数据
     */
    @Override
    public UserBankFeignDto getByUserId(Long userId) {
        // 获取用户银行卡数据
        UserBank userBank = getOne(new LambdaQueryWrapper<UserBank>().eq(UserBank::getUserId, userId));
        // 校验查询的数据，如果是空返回空
        if (userBank == null) return null;
        // 将用户的银行卡数据转换为需要的 dto 对象，并返回
        return UserBankFeignDtoMapper.INSTANCE.convert2Dto(userBank);
    }

    /**
     * 给用户绑定一张银行卡数据，如果该银行卡不存在，那么这张银行卡会进行添加操作
     *
     * @param userId      需要给那个用户绑定银行卡的 ID
     * @param userBankDto 需要绑定银行卡的参数对象
     * @return ture: 绑定成功 false: 绑定失败
     */
    @Override
    public boolean bindBank(Long userId, UserBankDto userBankDto) {
        // 首先需要对支付密码进行匹配，如果不正确那么不能进行添加操作
        User user = userService.getById(userId);
        // 如果当前的用户支付密码和传入的支付密码不匹配则进行报错
        if (!BCrypt.checkpw(userBankDto.getPayPassword(), user.getPaypassword()))
            throw new IllegalArgumentException("支付密码错误，请核对后重新输入");
        // 查看传递的数据是否存在 ID，如果存在是修改，不存在则是添加
        Long id = userBankDto.getId();
        // 创建需要进行修改的对象
        UserBank userBank = new UserBank();
        // 对值进行 copy
        BeanUtil.copyProperties(userBankDto, userBank);
        if (id != null)  // 对数据进行修改操作
            // 对数据进行更新，并返回更新结果
            return updateById(userBank);
        else {// 对数据进行添加操作
            // 修改数据中的 userId 改为自己，表示是自己的银行卡绑定
            userBank.setUserId(userId);
            // 设置银行卡默认状态
            userBank.setStatus((byte) 1);
            // 对数据进行保存操作，并返回添加结果
            return save(userBank);
        }
    }
}
